SIGSET(3) | Linux Programmer's Manual | SIGSET(3) |
名前¶
sigset, sighold, sigrelse, sigignore - System V 版シグナル API
書式¶
#define _XOPEN_SOURCE 500
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t sigset(int sig, sighandler_t disp);
int sighold(int sig);
int sigrelse(int sig);
int sigignore(int sig);
説明¶
これらの関数は、昔ながらの System V 版シグナル API を使用しているプログラム に対して互換性のあるインタフェースを glibc で提供するものである。 この API は過去のものであり、新しいアプリケーションでは POSIX シグナル API (sigaction(2), sigprocmask(2) など) を使用すべきである。
関数 sigset() はシグナル sig のシグナルハンドラの動作を変更する。 disp 引き数には、シグナルハンドラ関数のアドレスか、 以下の定数のいずれか一つを指定できる。
- SIG_DFL
- sig の動作をデフォルトにリセットする。
- SIG_IGN
- sig を無視する。
- SIG_HOLD
- そのプロセスのシグナルマスクに sig を追加するが、 sig の動作は変更しない。
disp にシグナルハンドラのアドレスが指定された場合、 シグナルハンドラの実行中は、そのプロセスのシグナルマスクに sig が追加される。
disp に SIG_HOLD 以外の値が指定された場合、 そのプロセスのシグナルマスクから sig が削除される。
シグナル SIGKILL と SIGSTOP に対する動作は変更できない。
関数 sighold() は、呼び出し元プロセスのシグナルマスクに sig を追加する。
関数 sigrelse() は、呼び出し元プロセスのシグナルマスクから sig を削除する。
関数 sigignore() は、 sig の動作を SIG_IGN に設定する。
返り値¶
sigset() は成功すると、 呼び出し前に sig がブロックされていた場合には SIG_HOLD を返し、 ブロックされていなかった場合には 変更前のそのシグナルの動作を返す。 エラーの場合、 sigset() は -1 を返し、 errno にエラーを示す値をセットする。 但し、以下の「バグ」の節も参照のこと。
関数 sighold(), sigrelse(), sigignore() は成功すると 0 を返す。エラーの場合、-1 を返し、 errno にエラーを示す値をセットする。
エラー¶
sigset() に関しては、 sigaction(2) と sigprocmask(2) の「エラー」の節を参照。
sighold() と sigrelse() に関しては、 sigprocmask(2) の「エラー」の節を参照。
sigignore() に関しては、 sigaction(2) の「エラー」の節を参照。
準拠¶
SVr4, POSIX.1-2001. これらの関数は廃止予定である。新しいプログラムでは使用しないこと。 POSIX.1-2008 は、 sighold(), sigignore(), sigpause(), sigrelse(), sigset() を廃止予定としている。 代わりに、 sigaction(2), sigprocmask(2), pthread_sigmask(3), sigsuspend(2) の使用が推奨されている。
注意¶
これらの関数は glibc 2.1 で登場した。
sighandler_t 型は GNU による拡張であり、この man page で sigset() のプロトタイプをより読みやすくするために使われているだけである。
関数 sigset() は信頼性のあるシグナル処理機構を提供する (sa_mask を 0 で sigaction(2) を呼び出したときと同様)。
System V では、関数 signal() が提供する処理機構は信頼性のないものである (sa_mask を SA_RESETHAND | SA_NODEFER として sigaction(2) を呼び出したときと同様)。 BSD では、 signal() は信頼性のある処理機構を提供する。 POSIX.1-2001 では、 signal() のこの点は規定しないままとなっている。 さらなる詳細については signal(2) を参照。
BSD と System V のどちらのシステムでも シグナルを待つために、 sigpause(3) という名前の関数が提供されているが、 この関数の引き数は両方のシステムで異なる。 詳細は sigpause(3) を参照。
バグ¶
2.2 より前のバージョンの glibc では、 disp に SIG_HOLD 以外の値が指定された場合、 sig のブロック解除を行っていなかった。
2.3.5 以前の全てのバージョンの glibc では、 sigset() が変更前のシグナルの動作を正しく返さない場合が 2つある。 一つめは、 disp に SIG_HOLD が指定されると、成功した場合 sigset() は常に SIG_HOLD を返すことである。 正しくは、(シグナルがブロックされていなかった場合には) 変更前のシグナルの動作を返すべきである (シグナルがブロックされていた場合には、 SIG_HOLD が返される)。 もう一つは、シグナルが現在ブロックされている場合には、 成功した場合の sigset() の返り値は SIG_HOLD になるべきであるが、実際には 変更前のシグナルの動作が返されることである。 これらの問題は glibc 2.5 以降で修正されている。
関連項目¶
kill(2), pause(2), sigaction(2), signal(2), sigprocmask(2), raise(3), sigpause(3), sigvec(3), feature_test_macros(7), signal(7)
2009-03-15 | Linux |